package com.nageoffer.shortlink.project.dao.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nageoffer.shortlink.project.dao.entity.LinkAccessStatsDO;
import com.nageoffer.shortlink.project.dto.req.ShortLinkGroupStatsReqDTO;
import com.nageoffer.shortlink.project.dto.req.ShortLinkStatsReqDTO;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;


import java.util.List;

/**
 * 短链接监控基础访问持久层
 */
@Mapper
public interface LinkAccessStatsMapper extends BaseMapper<LinkAccessStatsDO> {


    /**
     * 记录基础访问监控数据
     *
     * @param linkAccessStatsDO
     */
    @Insert("""
    INSERT INTO t_link_access_stats (
        full_short_url, 
        date, 
        pv, 
        uv, 
        uip, 
        hour, 
        weekday, 
        create_time, 
        update_time, 
        del_flag
    ) VALUES (
        #{linkAccessStats.fullShortUrl},
        #{linkAccessStats.date},
        #{linkAccessStats.pv},
        #{linkAccessStats.uv},
        #{linkAccessStats.uip},
        #{linkAccessStats.hour},
        #{linkAccessStats.weekday},
        NOW(),
        NOW(),
        0
    ) ON DUPLICATE KEY UPDATE 
        pv = pv + #{linkAccessStats.pv},
        uv = uv + #{linkAccessStats.uv},
        uip = uip + #{linkAccessStats.uip},
        update_time = NOW()
        """)
    void linkAccessStats(@Param("linkAccessStats") LinkAccessStatsDO linkAccessStatsDO);

    /**
     * 根据短链接获取指定日期内基础监控数据
     *
     * @param
     */

    List<LinkAccessStatsDO> listStatsByShortLink(@Param("param") ShortLinkStatsReqDTO requestParam);

    /**
     * 根据短链接获取指定日期内PV、UV、UIP数据
     *
     * @param requestParam
     * @return
     */
    LinkAccessStatsDO findPvUvUidStatsByShortLink(@Param("param") ShortLinkStatsReqDTO requestParam);


    /**
     * 根据短链接获取指定日期内小时基础监控数据
     */
    List<LinkAccessStatsDO> linkAccessStatsMapper(@Param("param") ShortLinkStatsReqDTO requestParam);

    /**
     * 根据短链接获取一周访问详情
     *
     * @param requestParam
     * @return
     */
    List<LinkAccessStatsDO> listWeekdayStatsByShortLink(@Param("param") ShortLinkStatsReqDTO requestParam);

    /**
     * 根据分组获取指定日期内基础监控数据
     *
     * @param requestParam
     * @return
     */
    List<LinkAccessStatsDO> listStatsByGroup(@Param("param") ShortLinkGroupStatsReqDTO requestParam);

    /**
     * 根据分组获取指定日期内小时基础监控数据
     *
     * @param requestParam
     * @return
     */
    List<LinkAccessStatsDO> listHourStatsByGroup(@Param("param") ShortLinkGroupStatsReqDTO requestParam);

    /**
     * 根据分组获取指定日期内小时基础监控数据
     *
     * @param requestParam
     * @return
     */
    List<LinkAccessStatsDO> listWeekdayStatsByGroup(@Param("param") ShortLinkGroupStatsReqDTO requestParam);

}
